const bcryptjs = require('bcryptjs')
const userModel = require('../db/user')
const respond = require('../utils/respond')
const writeErrLog = require('../utils/writeErrLog')
const jwt = require('jsonwebtoken')

module.exports = {

    //注册 =>post传输
    register: (req, res) => {
        let { username, password, email } = req.body
        //判断非空
        if (!username || !password || !email) {
            respond(res, 1, '请输入,不要留空')
            return
        }
        //判断该用户名是否已经存在
        userModel.findOne({ username }, (err, docs) => {
            //如果查询不成功
            if (err) {
                respond(res, 1, '查询数据失败')
                return
            }
            //查询成功
            // 返回空数据
            if (docs) {
                respond(res, 1, '用户已存在')
                return
            }
            //数据中没找到该用户,可以注册
            userModel.insertMany({ username, password: bcryptjs.hashSync(password, 10), email }, (err, docs) => {
                if (err) {
                    respond(res, 2, '添加用户信息过程出错')
                    return
                }
                if (!docs) {
                    respond(res, 2, '添加用户信息结果出错,返回空')
                    return
                }
                respond(res, 0, '用户信息添加成功')


            })
        })
    },


    //登录 =>post传输
    login: (req, res) => {
        let { username, password } = req.body
        //判断是否为空
        if (!username || !password) {
            respond(res, 1, '请输入,不要留空')
            return
        }
        //判断用户是否已经登陆
        userModel.findOne({ username }, (err, docs) => {
            if (err) {
                respond(res, 2, '登陆操作失败')
                return
            }
            //传回信息为空
            if (!docs) {
                respond(res, 2, '未注册')
                return
            }
            //创建一个令牌
            let token = jwt.sign({
                username,
                startTime: +new Date(),
                //startTime单位是毫秒
                expires: 7200 * 1000
                //expires单位是秒
            }, 'abcdefg')


            //数据中存在此用户,可以登录
            if (bcryptjs.compareSync(password, docs.password)) {
                writeErrLog('登录成功')
                respond(res, 0, '登录成功', {
                    token: token,
                    userid: docs._id
                })
                return
            }
            respond(res, 2, '登陆失败1')
        })
    },

    //获取用户信息 =>get传输
    getUsers: (req, res) => {
        let { _id } = req.params
        //验证数据是否为空: _id为空时,!_id为true
        if (!_id) {
            respond(res, 2, '缺失用户id参数')
            return
        }
        //在数据库中查询id是否存在
        userModel.findOne({ _id }, { __v: 0, password: 0 }, (err, docs) => {
            if (err) {
                respond(res, 2, '用户信息获取失败')
                return
            }
            if (!docs) {
                respond(res, 2, '用户信息获取失败')
                return
            }

            // 验证是否是获取自己的信息
            if (req.tokenData.username != docs.username) {
                respond(res, 6, '不能获取别人的信息')
                return
            }

            docs.avatar = 'http://localhost:3000/' + docs.avatar
            // 给前端响应用户信息数据
            respond(res, 0, '用户信息获取成功', docs)

        })



    },
    //修改用户信息
    editUser: async (req, res) => {
        // 从地址栏中获取用户id
        let { _id } = req.params
        //  console.log(_id);
        //  console.log( req.body );
        let { username, email } = req.body
        // 组合文件路径
        console.log(req.file.filename);
        let filePath = 'uploads/' + req.file.filename
        let docs = await userModel.updateOne({ _id }, {
            username,
            email,
            avatar: filePath
        })
        respond(res, 0, '修改成功')
    },

    //修改密码
    pwdchange: async (req, res) => {
        console.log('测试开始');
        let { _id } = req.params
        let {oldpwd, newpwd } = req.body
        console.log(_id);

        //在数据库中查询id是否存在
        let docs = await userModel.findOne({ _id }, { __v: 0 })
        
        if (!docs) {
            respond(res, 2, '修改密码失败')
            return
        }

        // 验证是否是获取自己的信息
        if (req.tokenData.username != docs.username) {
            respond(res, 6, '不能获取别人的信息')
            return
        }
        let istrue = bcryptjs.compareSync(oldpwd, docs.password)
        console.log(istrue);
        if (istrue) {
            let tt = await userModel.updateOne({ _id: _id }, { password: bcryptjs.hashSync(newpwd, 10) })
            console.log(tt);
            if (tt) {
                respond(res, 0, '密码修改成功', tt)
            }
        }
    }
}